from django.shortcuts import render
from django.conf import settings
from django.views import View
from django.http import JsonResponse
from alipay import AliPay
from orders.models import OrderInfo
from payment.models import Payment


# Create your views here.
class PaymentView(View):
    """订单支付功能"""

    def get(self, request, order_id):
        # 查询要支付的订单
        user = request.user
        try:
            order = OrderInfo.objects.get(order_id=order_id,
                                          user=user,
                                          status=OrderInfo.ORDER_STATUS_ENUM['UNPAID'])
        except:
            return JsonResponse({'code': 400,
                                 'errmsg': 'order_id有误'},
                                status=400)

        # 1、初始化阿里支付对象
        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 默认回调url
            app_private_key_path='/home/ubuntu/Desktop/meiduo_project/meiduo_mall/meiduo_mall/apps/payment/keys/app_private_key.pem',
            # 支付宝的公钥，验证支付宝回传消息使用，不是你自己的公钥,
            alipay_public_key_path='/home/ubuntu/Desktop/meiduo_project/meiduo_mall/meiduo_mall/apps/payment/keys/alipay_public_key.pem',
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=True  # 默认False
        )
        # 2、使用对象方法生成登录支付宝跳转链接
        order_string = alipay.api_alipay_trade_page_pay(
            out_trade_no=order_id,  # 订单编号
            total_amount=str(order.total_amount),  # 订单总价
            subject='美多商城',  # 服务名称
            return_url=settings.ALIPAY_RETURN_URL,  # 跳转地址
        )

        # 响应登录支付宝连接
        # 真实环境电脑网站支付网关：https://openapi.alipay.com/gateway.do? + order_string
        # 沙箱环境电脑网站支付网关：https://openapi.alipaydev.com/gateway.do? + order_string
        alipay_url = settings.ALIPAY_URL + order_string
        return JsonResponse({
            'code': 1,
            'msg': 'OK',
            'alipay_url': alipay_url
        })


# 支付保存
class PaymentStatuView(View):
    """
        保存支付结果
    """

    def put(self, request):
        # 验证链接信息是否是支付宝的链接请求
        # 创建支付宝支付对象
        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 默认回调url
            app_private_key_path='/home/ubuntu/Desktop/meiduo_project/meiduo_mall/meiduo_mall/apps/payment/keys/app_private_key.pem',
            # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            alipay_public_key_path='/home/ubuntu/Desktop/meiduo_project/meiduo_mall/meiduo_mall/apps/payment/keys/alipay_public_key.pem',
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=True  # 默认False
        )

        # 1、将验证数据转为字典
        # 获取前端传入的请求参数
        query_dict = request.GET
        data = query_dict.dict()
        # 2,使用 pop 从字典中删除并取出验证信息
        signature = data.pop("sign")

        # 3、调用验证verify方法进行数据的验证
        # 校验这个重定向是否是alipay重定向过来的
        success = alipay.verify(data, signature)
        if success:
            # 验证成功,保存支付结果
            order_id = data.get('out_trade_no')  # 获取支付宝返回的美多的订单编号
            trade_id = data.get('trade_no')  # 获取支付宝返回的交易流水号
            # 保存Payment模型类数据
            Payment.objects.create(order_id=order_id, trade_id=trade_id)

            # 修改当前的订单状态为待发货
            # OrderInfo.objects.filter(order_id=order_id).update(status=OrderInfo.ORDER_STATUS_ENUM['UNSEND'])
            OrderInfo.objects.filter(order_id=order_id).update(status=2)

            return JsonResponse({
                'code': 0,
                'errmsg': 'ok',
                'trade_id': trade_id
            })
        else:
            # 订单支付失败，重定向到我的订单
            return JsonResponse({
                'code': 400,
                'errmsg': '支付失败'
            }, status=400)
